#include <iostream>
#include <vector>
#include <string>
#include <ctype.h>
using namespace std;
// 实验内容：
// 从键盘输入一篇文章，统计其中单词出现的次数（不区分大小写），
// 并输出出现次数排名第一的单词及其次数。
// 注意：可能有多个单词并列第一，需要全部输出。
// 输出时，如果有多个单词排名并列，
// 则按其在文章中出现的先后顺序输出，先出现的先输出。

// 说明：为简单起见，单词的含义是空白字符分隔开的连续字符串。
// 比如“I love China!”这句话包含三个单词，第三个单词是“China!”（包括其中的感叹号），
// 再如“Hi !”，这句话包含两个单词，第二个单词仅为一个感叹号。

class WordCount;
string& ToLower(string&);
void CountWord(vector<WordCount>&, string&);
void DisplayResult(const vector<WordCount>&);

//参考以下main函数：
int main()
{
    vector<WordCount> vwc;
    string str;
    int i;

    while (cin >> str)
    {
        str = ToLower(str);
        CountWord(vwc, str);
    }
    DisplayResult(vwc);

    return 0;
}

// 其中：
// WordCount类：存储单词及其出现次数
// ToLower函数：传入一个字符串，将其中大写英文字母转换为小写、其余字符保持不变，返回转换后的结果。
// CountWord函数：传入一个vector和一个单词，在vector中查找该单词是否已存在
//（注意：vector中的元素为WordCount对象，该对象有一个属性为单词字符串），
// 如果已存在，则将其出现次数加1，
// 否则在vector中添加一个元素（WordCount对象），该元素存储这个新的单词及其出现次数（此时为1）。
// DisplayResult函数：传入一个vector，输出其中出现次数最高的单词及其次数。
// 请实现以上定义的WordCount类及三个函数。

struct WordCount
{
    string _str;
    int _count;
};

string& ToLower(string& str) 
{
    for (auto& e : str)
        e = tolower(e);
    return str;
}

void CountWord(vector<WordCount>& vwc, string& str)
{
    int i = 0, n = vwc.size();
    for (; i < n; i++)
    {
        if (vwc[i]._str == str)
        {
            vwc[i]._count++;
            break;
        }
    }
    if (i == n) vwc.push_back({ str, 1 });
}

void DisplayResult(const vector<WordCount>& vwc)
{
    vector<string> tgt;
    tgt.push_back(vwc[0]._str);
    int count = vwc[0]._count;
    int n = vwc.size();
    for (int i = 1; i < n; i++)
    {
        if (count == vwc[i]._count)
        {
            tgt.push_back(vwc[i]._str);
        }
        else if (count < vwc[i]._count)
        {
            count = vwc[i]._count;
            tgt.resize(0);
            tgt.push_back(vwc[i]._str);
        }
    }
    for (auto& e : tgt)
    {
        cout << e << ' ' << count << endl;
    }
}
